@bridge-ds/core 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -544,7 +544,7 @@ function groupsPhrase(groups) {
544
544
  }
545
545
  function whoCanShipSentence(policy) {
546
546
  const names = (policy.entries ?? policy.logins).map((l) => entryLabel(l, policy.teams)).join(", ");
547
- return `Only ${groupsPhrase(policy.groups)} can ship this${names ? ` (${names})` : ""}.`;
547
+ return `Only ${groupsPhrase(policy.groups)} can merge this${names ? ` (${names})` : ""}.`;
548
548
  }
549
549
  const DEFAULT_VISUAL_IMPACT = { mode: "auto" };
550
550
  const VISUAL_CHECK_LABEL = "visual-check";
@@ -2885,18 +2885,114 @@ const SPEC_FIELDS = [
2885
2885
  "paddingBottom",
2886
2886
  "paddingLeft",
2887
2887
  "itemSpacing",
2888
+ "counterAxisSpacing",
2888
2889
  "width",
2889
2890
  "height",
2890
2891
  "minWidth",
2891
2892
  "minHeight",
2893
+ "opacity",
2892
2894
  "textFill",
2893
2895
  "fontFamily",
2894
2896
  "fontSize",
2895
2897
  "fontWeight",
2896
2898
  "lineHeight",
2897
- "letterSpacing"
2899
+ "letterSpacing",
2900
+ "textDecoration"
2898
2901
  ];
2899
2902
  const COLOR_FIELDS = /* @__PURE__ */ new Set(["fill", "stroke", "textFill"]);
2903
+ function coverageSummary(file) {
2904
+ const list2 = file.coverage ?? file.components.map((c) => ({ name: c.name, status: "generated" }));
2905
+ const generated = list2.filter((c) => c.status === "generated").length;
2906
+ const drafted = list2.filter((c) => c.status === "drafted").length;
2907
+ const layout = list2.filter((c) => c.status === "layout").length;
2908
+ return { generated, drafted, inFigma: generated + drafted, visual: list2.length - layout, layout, total: list2.length, missing: list2.filter((c) => c.status === "unsupported") };
2909
+ }
2910
+ const LAYOUT_DIRECTIONS = /* @__PURE__ */ new Set(["HORIZONTAL", "VERTICAL"]);
2911
+ const PRIMARY = /* @__PURE__ */ new Set(["MIN", "CENTER", "MAX", "SPACE_BETWEEN"]);
2912
+ const COUNTER = /* @__PURE__ */ new Set(["MIN", "CENTER", "MAX", "STRETCH"]);
2913
+ const PART_KINDS = /* @__PURE__ */ new Set(["frame", "text", "icon", "vector"]);
2914
+ function validateComponentSpec(spec, tokenTypes) {
2915
+ const out = [];
2916
+ const at = (where, why) => out.push(`${spec.name ?? "spec"}: ${where}: ${why}`);
2917
+ if (typeof spec.name !== "string" || !spec.name) return ["the spec has no name"];
2918
+ if (!Array.isArray(spec.axes) || !Array.isArray(spec.properties) || !Array.isArray(spec.parts) || !Array.isArray(spec.variants) || !Array.isArray(spec.unmapped)) return [`${spec.name}: axes, properties, parts, variants and unmapped must be lists`];
2919
+ const axisNames = /* @__PURE__ */ new Set();
2920
+ for (const a of spec.axes) {
2921
+ if (!a.name || axisNames.has(a.name)) at("axes", `"${a.name}" is missing or repeated`);
2922
+ axisNames.add(a.name);
2923
+ if (!Array.isArray(a.values) || !a.values.length) at(`axis ${a.name}`, "has no values");
2924
+ else if (!a.values.includes(a.default)) at(`axis ${a.name}`, `default "${a.default}" is not one of its values`);
2925
+ }
2926
+ const props = /* @__PURE__ */ new Map();
2927
+ for (const p of spec.properties) {
2928
+ if (props.has(p.name)) at("properties", `"${p.name}" is repeated`);
2929
+ props.set(p.name, p);
2930
+ if (p.type !== "TEXT" && p.type !== "BOOLEAN") at(`property ${p.name}`, `type ${String(p.type)} is not TEXT or BOOLEAN`);
2931
+ else if (typeof p.default !== (p.type === "TEXT" ? "string" : "boolean")) at(`property ${p.name}`, `default must be a ${p.type === "TEXT" ? "text" : "true or false"}`);
2932
+ }
2933
+ const parts = /* @__PURE__ */ new Map();
2934
+ for (const part of spec.parts) {
2935
+ if (!part.id || parts.has(part.id)) at("parts", `id "${part.id}" is missing or repeated`);
2936
+ if (!PART_KINDS.has(part.kind)) at(`part ${part.id}`, `kind ${String(part.kind)} is not frame, text, icon or vector`);
2937
+ if (part.parent === void 0) {
2938
+ if ([...parts.values()].some((x) => x.parent === void 0)) at(`part ${part.id}`, "a second root (every other part needs a parent)");
2939
+ } else if (!parts.has(part.parent)) at(`part ${part.id}`, `parent "${part.parent}" is not a part listed before it`);
2940
+ else if (parts.get(part.parent).kind !== "frame") at(`part ${part.id}`, `parent "${part.parent}" is not a frame`);
2941
+ if (part.layout && (!LAYOUT_DIRECTIONS.has(part.layout.direction) || !PRIMARY.has(part.layout.primary) || !COUNTER.has(part.layout.counter))) at(`part ${part.id}`, "layout is not a valid auto layout");
2942
+ if (part.text !== void 0 && props.get(part.text)?.type !== "TEXT") at(`part ${part.id}`, `text property "${part.text}" does not exist`);
2943
+ if (part.visible !== void 0 && props.get(part.visible)?.type !== "BOOLEAN") at(`part ${part.id}`, `visibility property "${part.visible}" does not exist`);
2944
+ if (part.kind === "text" && part.text === void 0 && part.characters === void 0 && !part.swap) at(`part ${part.id}`, "a text part needs a TEXT property or its characters");
2945
+ parts.set(part.id, part);
2946
+ }
2947
+ if (!spec.parts.length || spec.parts[0].parent !== void 0) at("parts", "the first part must be the root");
2948
+ const expected = spec.axes.reduce((n, a) => n * (a.values?.length || 1), 1);
2949
+ if (spec.variants.length !== expected) at("variants", `${spec.variants.length} variants for ${expected} combinations of the axes`);
2950
+ const seen = /* @__PURE__ */ new Set();
2951
+ for (const v of spec.variants) {
2952
+ const key = variantKeyOf(v.props ?? {});
2953
+ const where = `variant ${key}`;
2954
+ if (seen.has(key)) at(where, "is repeated");
2955
+ seen.add(key);
2956
+ for (const a of spec.axes) if (!a.values?.includes(v.props?.[a.name] ?? "")) at(where, `${a.name} is not one of its values`);
2957
+ for (const k of Object.keys(v.props ?? {})) if (!axisNames.has(k)) at(where, `${k} is not an axis`);
2958
+ for (const [id, fields] of Object.entries(v.values ?? {})) {
2959
+ const part = parts.get(id);
2960
+ if (!part) {
2961
+ at(where, `values for "${id}", which is not a part`);
2962
+ continue;
2963
+ }
2964
+ for (const [field, value] of Object.entries(fields ?? {})) {
2965
+ if (!SPEC_FIELDS.includes(field)) at(`${where}, ${id}`, `${field} is not a field`);
2966
+ else if (value === null) {
2967
+ if (!COLOR_FIELDS.has(field)) at(`${where}, ${id}`, `${field} cannot be empty (only colors can be none)`);
2968
+ } else if (typeof value === "number") {
2969
+ if (COLOR_FIELDS.has(field)) at(`${where}, ${id}`, `${field} cannot be a number`);
2970
+ } else if (typeof value !== "string") at(`${where}, ${id}`, `${field} must be a token path, a number or none`);
2971
+ else if (field === "textDecoration") {
2972
+ if (!/^(UNDERLINE|STRIKETHROUGH|NONE)$/.test(value)) at(`${where}, ${id}`, `${value} is not a text decoration`);
2973
+ } else if (tokenTypes) {
2974
+ for (const path of value.startsWith("calc(") ? (value.match(/[A-Za-z][\w.-]*/g) ?? []).filter((x) => x !== "calc" && !/^\d|^px$/.test(x)) : [value]) {
2975
+ const type = tokenTypes.get(path);
2976
+ if (!type) at(`${where}, ${id}`, `${path} is not a token`);
2977
+ else if (!value.startsWith("calc(") && !FIELD_TOKEN_TYPES(field).includes(type)) at(`${where}, ${id}`, `${path} is a ${type} token, ${field} needs ${FIELD_TOKEN_TYPES(field).join(" or ")}`);
2978
+ }
2979
+ }
2980
+ }
2981
+ }
2982
+ for (const id of v.hidden ?? []) if (!parts.has(id)) at(where, `hides "${id}", which is not a part`);
2983
+ for (const id of Object.keys(v.layout ?? {})) if (!parts.has(id)) at(where, `lays out "${id}", which is not a part`);
2984
+ for (const [id, vec] of Object.entries(v.vectors ?? {})) if (parts.get(id)?.kind !== "vector" || !/^<svg[\s>]/.test(vec.svg)) at(where, `vector "${id}" is not a vector part with an SVG`);
2985
+ for (const id of Object.keys(v.slots ?? {})) if (!parts.has(id)) at(where, `shows a component in "${id}", which is not a part`);
2986
+ }
2987
+ return out;
2988
+ }
2989
+ function FIELD_TOKEN_TYPES(field) {
2990
+ if (COLOR_FIELDS.has(field)) return ["color"];
2991
+ if (field === "fontFamily") return ["fontFamily"];
2992
+ if (field === "fontWeight") return ["fontWeight", "number"];
2993
+ if (field === "opacity") return ["number"];
2994
+ return ["dimension", "number"];
2995
+ }
2900
2996
  const iconComponentName = (name) => `Icon/${name}`;
2901
2997
  function specHash(text) {
2902
2998
  let h = 2166136261;
@@ -2907,7 +3003,7 @@ function specHash(text) {
2907
3003
  return (h >>> 0).toString(16).padStart(8, "0");
2908
3004
  }
2909
3005
  function hashSpec(spec) {
2910
- const { hash: _ignored, ...rest } = spec;
3006
+ const { hash: _ignored, example: _example, ...rest } = spec;
2911
3007
  return specHash(JSON.stringify(rest));
2912
3008
  }
2913
3009
  const variantName = (props) => Object.entries(props).map(([k, v]) => `${k}=${v}`).join(", ");
@@ -2926,205 +3022,207 @@ function parseComponentSpecs(text) {
2926
3022
  }
2927
3023
  const tokenCssVar = (path, prefix = "--", separator = "-") => `${prefix}${path.split(".").join(separator)}`;
2928
3024
  export {
2929
- tokensPath as $,
2930
- flattenTokens as A,
2931
- serializeTokenFile as B,
2932
- COMPONENT_SPECS_VERSION as C,
2933
- removeToken as D,
2934
- upsertToken as E,
2935
- threeWayDiff as F,
2936
- emptyTokenFile as G,
2937
- parseTokenFile as H,
2938
- EXT_ID as I,
2939
- EXT_SCOPES as J,
2940
- resolve as K,
2941
- moveToken as L,
2942
- effectiveScopes as M,
2943
- sameScopes as N,
2944
- defaultScopes as O,
2945
- readTokenAt as P,
2946
- modeFile as Q,
2947
- defaultFile as R,
3025
+ buildHistoryEntry as $,
3026
+ contextLabel as A,
3027
+ pathId as B,
3028
+ CONFIG_FILE as C,
3029
+ flattenTokens as D,
3030
+ serializeTokenFile as E,
3031
+ removeToken as F,
3032
+ upsertToken as G,
3033
+ threeWayDiff as H,
3034
+ emptyTokenFile as I,
3035
+ parseTokenFile as J,
3036
+ EXT_ID as K,
3037
+ EXT_SCOPES as L,
3038
+ resolve as M,
3039
+ moveToken as N,
3040
+ effectiveScopes as O,
3041
+ sameScopes as P,
3042
+ defaultScopes as Q,
3043
+ readTokenAt as R,
2948
3044
  SINGLE_MODE as S,
2949
3045
  TIER_NAMES as T,
2950
- DEFAULT_PROTECTED_BRANCHES as U,
2951
- ProtectedBranchError as V,
2952
- ConfigError as W,
2953
- DEFAULT_TOKEN_PATHS as X,
2954
- applyTokenEdits as Y,
2955
- buildHistoryEntry as Z,
2956
- resolveBranchPreviews as _,
3046
+ modeFile as U,
3047
+ defaultFile as V,
3048
+ DEFAULT_PROTECTED_BRANCHES as W,
3049
+ ProtectedBranchError as X,
3050
+ ConfigError as Y,
3051
+ DEFAULT_TOKEN_PATHS as Z,
3052
+ applyTokenEdits as _,
2957
3053
  assertSafeBranch as a,
2958
- contextFor as a$,
2959
- coerceValue as a0,
2960
- toConfigJson as a1,
2961
- parseContrastChecks as a2,
2962
- checkLayeredPair as a3,
2963
- classifyRisk as a4,
2964
- formatChangeset as a5,
2965
- RISK_LABELS as a6,
2966
- parseJson as a7,
2967
- serializeJson as a8,
2968
- plainEqual as a9,
2969
- RISK_TIER as aA,
2970
- SPEC_FIELDS as aB,
2971
- TIER_ORDER as aC,
2972
- TeamDirectory as aD,
2973
- UNRELEASED as aE,
2974
- VISUAL_CHECK_LABEL as aF,
2975
- affectedContrast as aG,
2976
- appForProject as aH,
2977
- appUrl as aI,
2978
- approverEntries as aJ,
2979
- approverLists as aK,
2980
- assignVersions as aL,
2981
- baseBranchOf as aM,
2982
- branchName as aN,
2983
- branchSlug as aO,
2984
- canShip as aP,
2985
- changeKind as aQ,
2986
- changeTable as aR,
2987
- changedModes as aS,
2988
- changesetBump as aT,
2989
- classifyLayered as aU,
2990
- clearRawDeep as aV,
2991
- commitMessage as aW,
2992
- composeChangeset as aX,
2993
- composePrBody as aY,
2994
- composeProposalBody as aZ,
2995
- composite as a_,
2996
- toPlain as aa,
2997
- getEntry as ab,
2998
- fromPlain as ac,
2999
- previewLinks as ad,
3000
- slugify as ae,
3001
- readPreviewComment as af,
3002
- findPreviewComment as ag,
3003
- previewsSettled as ah,
3004
- AAA_MIN as ai,
3005
- AA_MIN as aj,
3006
- BULK_LIMIT as ak,
3007
- CONTRAST_CELL_MAX as al,
3008
- CONTRAST_CHECKS_FILE as am,
3009
- DEFAULT_COMPONENT_SPECS_FILE as an,
3010
- DEFAULT_GOVERNANCE as ao,
3011
- DEFAULT_OVERRIDE as ap,
3012
- DEFAULT_RIGHTS as aq,
3013
- DEFAULT_VISUAL_IMPACT as ar,
3014
- JsonParseError as as,
3015
- OWNER_GROUPS as at,
3016
- PREVIEW_APP_LABELS as au,
3017
- PREVIEW_COMMENT_MARKER as av,
3018
- PREVIEW_PLACEHOLDERS as aw,
3019
- PRIMITIVE_MODE as ax,
3020
- RIGHTS as ay,
3021
- RIGHT_LABEL as az,
3054
+ composeProposalBody as a$,
3055
+ resolveBranchPreviews as a0,
3056
+ tokensPath as a1,
3057
+ coerceValue as a2,
3058
+ toConfigJson as a3,
3059
+ parseContrastChecks as a4,
3060
+ checkLayeredPair as a5,
3061
+ classifyRisk as a6,
3062
+ formatChangeset as a7,
3063
+ RISK_LABELS as a8,
3064
+ parseJson as a9,
3065
+ RIGHTS as aA,
3066
+ RIGHT_LABEL as aB,
3067
+ RISK_TIER as aC,
3068
+ SPEC_FIELDS as aD,
3069
+ TIER_ORDER as aE,
3070
+ TeamDirectory as aF,
3071
+ UNRELEASED as aG,
3072
+ VISUAL_CHECK_LABEL as aH,
3073
+ affectedContrast as aI,
3074
+ appForProject as aJ,
3075
+ appUrl as aK,
3076
+ approverEntries as aL,
3077
+ approverLists as aM,
3078
+ assignVersions as aN,
3079
+ baseBranchOf as aO,
3080
+ branchName as aP,
3081
+ branchSlug as aQ,
3082
+ canShip as aR,
3083
+ changeKind as aS,
3084
+ changeTable as aT,
3085
+ changedModes as aU,
3086
+ changesetBump as aV,
3087
+ classifyLayered as aW,
3088
+ clearRawDeep as aX,
3089
+ commitMessage as aY,
3090
+ composeChangeset as aZ,
3091
+ composePrBody as a_,
3092
+ serializeJson as aa,
3093
+ plainEqual as ab,
3094
+ toPlain as ac,
3095
+ getEntry as ad,
3096
+ fromPlain as ae,
3097
+ previewLinks as af,
3098
+ slugify as ag,
3099
+ readPreviewComment as ah,
3100
+ findPreviewComment as ai,
3101
+ previewsSettled as aj,
3102
+ AAA_MIN as ak,
3103
+ AA_MIN as al,
3104
+ BULK_LIMIT as am,
3105
+ CONTRAST_CELL_MAX as an,
3106
+ CONTRAST_CHECKS_FILE as ao,
3107
+ DEFAULT_COMPONENT_SPECS_FILE as ap,
3108
+ DEFAULT_GOVERNANCE as aq,
3109
+ DEFAULT_OVERRIDE as ar,
3110
+ DEFAULT_RIGHTS as as,
3111
+ DEFAULT_VISUAL_IMPACT as at,
3112
+ JsonParseError as au,
3113
+ OWNER_GROUPS as av,
3114
+ PREVIEW_APP_LABELS as aw,
3115
+ PREVIEW_COMMENT_MARKER as ax,
3116
+ PREVIEW_PLACEHOLDERS as ay,
3117
+ PRIMITIVE_MODE as az,
3022
3118
  parseChangelog as b,
3023
- tarballAssetName as b$,
3024
- contrastDelta as b0,
3025
- contrastDeltaTable as b1,
3026
- contrastLevel as b2,
3027
- contrastPair as b3,
3028
- contrastRatio as b4,
3029
- countChanges as b5,
3030
- defaultContext as b6,
3031
- defaultTitle as b7,
3032
- defineConfig as b8,
3033
- detectLayout as b9,
3034
- luminance as bA,
3035
- modeLabel as bB,
3036
- nodesEqual as bC,
3037
- normalizeRights as bD,
3038
- overrideKey as bE,
3039
- ownerEntryProblems as bF,
3040
- pairKey as bG,
3041
- parseChangesetText as bH,
3042
- parseComponentSpecs as bI,
3043
- parseOwnerEntry as bJ,
3044
- parseVercelComment as bK,
3045
- planRestore as bL,
3046
- planRevert as bM,
3047
- planToJson as bN,
3048
- previewComment as bO,
3049
- previewLinksOf as bP,
3050
- previewUrl as bQ,
3051
- projectOfLabel as bR,
3052
- protectedBranchesOf as bS,
3053
- renderedColor as bT,
3054
- rightsProblems as bU,
3055
- runLayeredContrast as bV,
3056
- sameToken as bW,
3057
- shipPolicy as bX,
3058
- snapshotUrl as bY,
3059
- specHash as bZ,
3060
- summarizeTokenChange as b_,
3061
- diffLayered as ba,
3062
- entriesFor as bb,
3063
- entryLabel as bc,
3064
- expandEntries as bd,
3065
- expandOwners as be,
3066
- fieldChanges as bf,
3067
- fileModes as bg,
3068
- filterHistory as bh,
3069
- findToken as bi,
3070
- findVercelComment as bj,
3071
- firstParagraph as bk,
3072
- formatNumber as bl,
3073
- formatOwnerEntry as bm,
3074
- getChild as bn,
3075
- groupsPhrase as bo,
3076
- holdersOf as bp,
3077
- indexByPath as bq,
3078
- inheritedTypeAt as br,
3079
- installCommand as bs,
3080
- installCommandFromPreviewComment as bt,
3081
- isGuardrail as bu,
3082
- isTeamEntry as bv,
3083
- isTokenFile as bw,
3084
- isVercelComment as bx,
3085
- kindForMin as by,
3086
- layeredImpact as bz,
3119
+ snapshotUrl as b$,
3120
+ composite as b0,
3121
+ contextFor as b1,
3122
+ contrastDelta as b2,
3123
+ contrastDeltaTable as b3,
3124
+ contrastLevel as b4,
3125
+ contrastPair as b5,
3126
+ contrastRatio as b6,
3127
+ countChanges as b7,
3128
+ coverageSummary as b8,
3129
+ defaultContext as b9,
3130
+ isVercelComment as bA,
3131
+ kindForMin as bB,
3132
+ layeredImpact as bC,
3133
+ luminance as bD,
3134
+ modeLabel as bE,
3135
+ nodesEqual as bF,
3136
+ normalizeRights as bG,
3137
+ overrideKey as bH,
3138
+ ownerEntryProblems as bI,
3139
+ pairKey as bJ,
3140
+ parseChangesetText as bK,
3141
+ parseComponentSpecs as bL,
3142
+ parseOwnerEntry as bM,
3143
+ parseVercelComment as bN,
3144
+ planRestore as bO,
3145
+ planRevert as bP,
3146
+ planToJson as bQ,
3147
+ previewComment as bR,
3148
+ previewLinksOf as bS,
3149
+ previewUrl as bT,
3150
+ projectOfLabel as bU,
3151
+ protectedBranchesOf as bV,
3152
+ renderedColor as bW,
3153
+ rightsProblems as bX,
3154
+ runLayeredContrast as bY,
3155
+ sameToken as bZ,
3156
+ shipPolicy as b_,
3157
+ defaultTitle as ba,
3158
+ defineConfig as bb,
3159
+ detectLayout as bc,
3160
+ diffLayered as bd,
3161
+ entriesFor as be,
3162
+ entryLabel as bf,
3163
+ expandEntries as bg,
3164
+ expandOwners as bh,
3165
+ fieldChanges as bi,
3166
+ fileModes as bj,
3167
+ filterHistory as bk,
3168
+ findToken as bl,
3169
+ findVercelComment as bm,
3170
+ firstParagraph as bn,
3171
+ formatNumber as bo,
3172
+ formatOwnerEntry as bp,
3173
+ getChild as bq,
3174
+ groupsPhrase as br,
3175
+ holdersOf as bs,
3176
+ indexByPath as bt,
3177
+ inheritedTypeAt as bu,
3178
+ installCommand as bv,
3179
+ installCommandFromPreviewComment as bw,
3180
+ isGuardrail as bx,
3181
+ isTeamEntry as by,
3182
+ isTokenFile as bz,
3087
3183
  collectHistory as c,
3088
- tarballUrl as c0,
3089
- teamKey as c1,
3090
- teamKeyOf as c2,
3091
- teamUnreadableMessage as c3,
3092
- teamsIn as c4,
3093
- titleOf as c5,
3094
- toChangeSummary as c6,
3095
- toMap as c7,
3096
- tokenBump as c8,
3097
- tokenHistory as c9,
3098
- tokenNode as ca,
3099
- unreadableShipTeams as cb,
3100
- unreadableTeams as cc,
3101
- valueIn as cd,
3102
- variantName as ce,
3103
- versionTimeline as cf,
3104
- visualImpactProblems as cg,
3105
- whoCanShipSentence as ch,
3184
+ summarizeTokenChange as c0,
3185
+ tarballAssetName as c1,
3186
+ tarballUrl as c2,
3187
+ teamKey as c3,
3188
+ teamKeyOf as c4,
3189
+ teamUnreadableMessage as c5,
3190
+ teamsIn as c6,
3191
+ titleOf as c7,
3192
+ toChangeSummary as c8,
3193
+ toMap as c9,
3194
+ tokenBump as ca,
3195
+ tokenHistory as cb,
3196
+ tokenNode as cc,
3197
+ unreadableShipTeams as cd,
3198
+ unreadableTeams as ce,
3199
+ valueIn as cf,
3200
+ variantName as cg,
3201
+ versionTimeline as ch,
3202
+ visualImpactProblems as ci,
3203
+ whoCanShipSentence as cj,
3106
3204
  buildReport as d,
3107
3205
  prNumberFromSubject as e,
3108
- CONFIG_FILE as f,
3206
+ variantKeyOf as f,
3109
3207
  layoutOptions as g,
3110
3208
  hashSpec as h,
3111
- buildTokenSet as i,
3112
- iconComponentName as j,
3113
- COLOR_FIELDS as k,
3209
+ iconComponentName as i,
3210
+ buildTokenSet as j,
3211
+ COMPONENT_SPECS_VERSION as k,
3114
3212
  loadConfig as l,
3115
3213
  mergeReleases as m,
3116
- modeDisplayName as n,
3117
- modesOf as o,
3214
+ COLOR_FIELDS as n,
3215
+ modeDisplayName as o,
3118
3216
  packageDirCandidates as p,
3119
- isMultiMode as q,
3217
+ modesOf as q,
3120
3218
  releasesFromTags as r,
3121
- TIER_AXIS as s,
3219
+ specHash as s,
3122
3220
  tokenCssVar as t,
3123
- findReferenceProblems as u,
3124
- variantKeyOf as v,
3125
- evaluatePairs as w,
3126
- contrastScope as x,
3127
- contextLabel as y,
3128
- pathId as z
3221
+ isMultiMode as u,
3222
+ validateComponentSpec as v,
3223
+ TIER_AXIS as w,
3224
+ findReferenceProblems as x,
3225
+ evaluatePairs as y,
3226
+ contrastScope as z
3129
3227
  };
3130
- //# sourceMappingURL=component-spec-cvrSvIZj.js.map
3228
+ //# sourceMappingURL=component-spec-GFVEE6Fc.js.map